/**
 * 
 */
package pruebas.tiendaOl.riuCliente;

import java.io.Serializable;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.enterprise.context.Conversation;
import javax.enterprise.context.ConversationScoped;
import javax.enterprise.event.Observes;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.inject.Named;

import pruebas.tiendaOl.ipsWeb.IpsCarrito;
import pruebas.tiendaOl.ipsWeb.IpsCarrito.EventoCambiosCarrito;
import pruebas.tiendaOl.ipsWeb.IpsCarrito.IpsItemCarrito;

import com.intelap.jsfLib.ayudaDaosJava.AyudaDaoBusqueda_Java;
import com.intelap.jsfLib.decoracion.DaoBusqueda;
import com.intelap.jsfLib.decoracion.DciBuscador.MdcBuscadorPi;
import com.intelap.jsfLib.decoracion.DciCampo.DcaCampo;
import com.intelap.pureFabrications.AccesoPropMutableObservable;
import com.intelap.pureFabrications.AccesoPropMutableObservable.AccesoPropMutableObservableImpl;

/** RIU (Respaldo Interfaz Usuario) de la vista del Carrito
 * @author ggpollit */
@Named
@ConversationScoped
public class RiuCarrito implements Serializable {
	@Inject
	private Logger logger;
	@Inject
	private Conversation conversacion;
	@SuppressWarnings("cdi-ambiguous-dependency")
	@Inject
	private IpsCarrito ipsCarrito;

	@PostConstruct
	void postConstruct() {
		if (this.conversacion.isTransient())
			this.conversacion.begin();
		logger.info("postConstruct de RiuCarrito#" + System.identityHashCode(this) + " asociado a conversacion#" + conversacion.getId());
	}

	void itemCarritoHaCambiado(@Observes EventoCambiosCarrito evento) {
		accesoItemCarritoElegido.setValor(null);
		getMdcBuscadorItemCarrito().datosAsistenciaHanCambiado();
	}


	//// navegador de items carrito ////

	private MdcBuscadorItemCarrito mdcBuscadorItemCarrito = null;

	public MdcBuscadorItemCarrito getMdcBuscadorItemCarrito() {
		if (this.mdcBuscadorItemCarrito == null) {
			this.mdcBuscadorItemCarrito = new MdcBuscadorItemCarrito(this.accesoItemCarritoElegido);
		}
		return this.mdcBuscadorItemCarrito;
	}

	private final AccesoPropMutableObservable<IpsItemCarrito> accesoItemCarritoElegido = new AccesoPropMutableObservableImpl<IpsItemCarrito>(null);

	private class MdcBuscadorItemCarrito extends MdcBuscadorPi<IpsItemCarrito, ItemCarritoAdaptado> {
		public MdcBuscadorItemCarrito(AccesoPropMutableObservable<IpsItemCarrito> acceso) {
			super(acceso, null);
		}

		@Override
		public String getEncabezadoTabla() {
			return "Carrito";
		}

		@Override
		protected Class<ItemCarritoAdaptado> getTipoElemsAdaptados() {
			return ItemCarritoAdaptado.class;
		}

		@Override
		protected IpsItemCarrito getRespaldo(ItemCarritoAdaptado elementoAdaptado) {
			return elementoAdaptado.respaldo;
		}

		@Override
		protected DaoBusqueda<ItemCarritoAdaptado> getDaoBusqueda() {
			return this.daoBusquedaItemCarrito;
		}

		private final DaoBusqueda<ItemCarritoAdaptado> daoBusquedaItemCarrito = new AyudaDaoBusqueda_Java<IpsItemCarrito, ItemCarritoAdaptado>() {
			@Override
			protected List<? extends IpsItemCarrito> getElementos() {
				return ipsCarrito.getItems();
			}

			@Override
			protected Class<ItemCarritoAdaptado> getTipoElems() {
				return getTipoElemsAdaptados();
			}

			@Override
			protected ItemCarritoAdaptado adaptar(IpsItemCarrito elementoGenuino) {
				return new ItemCarritoAdaptado(elementoGenuino);
			}
		};
	}

	public static class ItemCarritoAdaptado {
		final IpsItemCarrito respaldo;

		ItemCarritoAdaptado(IpsItemCarrito ic) {
			this.respaldo = ic;
		}

		@DcaCampo(etiqueta = "tipo articulo", pesoUbicacion = 10)
		public String getNombreArticulo() {
			return respaldo.getNombre();
		}

		@DcaCampo
		public int getCantidad() {
			return respaldo.getCantidad();
		}
	}


	//// manejo de acciones del usuario ////

	public String botonBorrarHaSidoPresionado() {
		IpsItemCarrito itemCarritoElegido = this.accesoItemCarritoElegido.getValor();
		if (itemCarritoElegido == null) {
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Antes debe elegir un artículo"));
		} else {
			try {
				this.ipsCarrito.sacarArticulosDeCarrito(itemCarritoElegido, Integer.MAX_VALUE);
			} catch (Exception e) {
				logger.log(Level.INFO, "Excepcion al intentar sacar articulo del carrito: ", e);
				FacesContext.getCurrentInstance().addMessage(null,
						new FacesMessage("No se han podido quitar los articulos debido a un error del sistema", e.getMessage()));
				if( !conversacion.isTransient())
					conversacion.end();
				return "error";
			}
		}
		return null;
	}

	public String getOutcomeBotonIrAGondola() {
		return "gondola?cid="+this.conversacion.getId();
	}

	//// debug ////

	@PreDestroy
	void preDestroy() {
		logger.info("predestroy ---");
	}
}
